package main

import (
	"fmt"
	"strings"
)

func add(x, y int) int {
	return x + y
}

func sub(x, y int) int {
	return x - y
}

// 函数做参数示例
func calc(x, y int, op func(int, int) int) int {
	return op(x, y)
}

// 闭包
// 定义一个函数， 它的返回值是一个函数
func a() func() {
	name := "sunshicheng"
	return func() {
		fmt.Println("闭包函数，就是定义一个返回函数的函数.", name)
	}
}

func b(name string) func() {
	return func() {
		fmt.Println("闭包函数，返回函数的函数.", name)
	}
}

// 闭包检测文件的后缀名演示
func makeSuffixFunc(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

// 闭包综合示例,返回多个函数
func cal(base int) (func(int) int, func(int) int) {
	add := func(i int) int {
		base += i
		return base
	}

	sub := func(i int) int {
		base -= i
		return base
	}

	return add, sub
}

func main() {
	temp := calc(100, 200, add)
	fmt.Println(temp)
	temp1 := calc(200, 100, sub)
	fmt.Println(temp1)

	// 匿名函数

	// 直接使用
	func() {
		fmt.Println("直接执行匿名函数")
	}()

	// 赋值之后执行
	cFunc := func() {
		fmt.Println("赋值执行匿名函数")
	}

	cFunc()

	// 闭包函数的使用
	// 闭包 = 函数+ 外层变量的引用
	result := a()
	result() // 相当于执行a内部的匿名函数

	r := b("zcm")
	r()

	// 文件后缀检测示例
	txtFunc := makeSuffixFunc(".txt")
	fmt.Println(txtFunc("民调局异闻录"))

	// 综合闭包示例
	f1, f2 := cal(100)
	fmt.Println(f1(10), f2(20))

}
